package com.baidu.aip.sample;

import java.net.URLEncoder;
import java.util.HashMap;

import org.json.JSONObject;

import com.baidu.aip.face.AipFace;
import com.baidu.aip.util.Base64Util;
import com.baidu.aip.util.FileUtil;
import com.baidu.aip.util.HttpUtil;

/**
 * 人脸识别操作
 */
public class FaceSample {
	// 设置APPID/AK/SK
	public static final String APP_ID = "11130329";
	public static final String API_KEY = "l2QlKVCOWHoKnre8UHQEeqR4";
	public static final String SECRET_KEY = "uefa2aCm0Ejs05dBDwWZkQkS4TxoqWw7";

	/**
	 * 人脸库添加用户
	 */
	public static String add() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/add";
		try {
			// 本地文件路径
			String filePath = "[本地文件路径]";
			byte[] imgData = FileUtil.readFileByBytes(filePath);
			String imgStr = Base64Util.encode(imgData);
			String imgParam = URLEncoder.encode(imgStr, "UTF-8");

			String filePath2 = "[本地文件路径]";
			byte[] imgData2 = FileUtil.readFileByBytes(filePath2);
			String imgStr2 = Base64Util.encode(imgData2);
			String imgParam2 = URLEncoder.encode(imgStr2, "UTF-8");

			String param = "uid=" + "test_user_5" + "&user_info=" + "userInfo5" + "&group_id=" + "test_group_2"
					+ "&images=" + imgParam + "," + imgParam2;

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = "[调用鉴权接口获取的token]";

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 人脸库修改用户
	 */
	public static String update() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/update";
		try {
			// 本地文件路径
			String filePath = "[本地文件路径]";
			byte[] imgData = FileUtil.readFileByBytes(filePath);
			String imgStr = Base64Util.encode(imgData);
			String imgParam = URLEncoder.encode(imgStr, "UTF-8");

			String filePath2 = "[本地文件路径]";
			byte[] imgData2 = FileUtil.readFileByBytes(filePath2);
			String imgStr2 = Base64Util.encode(imgData2);
			String imgParam2 = URLEncoder.encode(imgStr2, "UTF-8");

			String param = "uid=" + "test_user_5" + "&images=" + imgParam + "," + imgParam2;

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = "[调用鉴权接口获取的token]";

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 人脸库删除用户
	 */
	public static String delete() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/delete";
		try {
			String param = "uid=" + "test_user_5";

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = "[调用鉴权接口获取的token]";

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 用户信息查询
	 */
	public static String get() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/get";
		try {
			String param = "uid=" + "test_user_5";

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = "[调用鉴权接口获取的token]";

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 组列表查询
	 */
	public static String getList() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/getlist";
		try {
			String param = "start=" + 0 + "&end=" + 100;

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = "[调用鉴权接口获取的token]";

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 组内用户列表查询
	 */
	public static String getUsers() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/getusers";
		try {
			String param = "group_id=" + "test_group_2" + "&start=" + 0 + "&end=" + 100;

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = "[调用鉴权接口获取的token]";

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 组内添加用户
	 */
	public static String addUser() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/adduser";
		try {
			String param = "uid=" + "test_user_5" + "&group_id=" + "test_group_2";

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = "[调用鉴权接口获取的token]";

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 组内删除用户
	 */
	public static String deleteUser() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/deleteuser";
		try {
			String param = "uid=" + "test_user_5" + "&group_id=" + "test_group_2";

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = "[调用鉴权接口获取的token]";

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 人脸对比
	 */
	public static String match() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/match";
		try {
			// 本地文件路径
			String filePath = "e:\\3.jpg";
			byte[] imgData = FileUtil.readFileByBytes(filePath);
			String imgStr = Base64Util.encode(imgData);
			String imgParam = URLEncoder.encode(imgStr, "UTF-8");

			String filePath2 = "e:\\2.png";
			byte[] imgData2 = FileUtil.readFileByBytes(filePath2);
			String imgStr2 = Base64Util.encode(imgData2);
			String imgParam2 = URLEncoder.encode(imgStr2, "UTF-8");

			String param = "images=" + imgParam + "," + imgParam2;

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = AuthService.getAuth();

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 人脸认证
	 */
	public static String verify() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/verify";
		try {
			// 本地文件路径
			String filePath = "e:\\2.png";
			byte[] imgData = FileUtil.readFileByBytes(filePath);
			String imgStr = Base64Util.encode(imgData);
			String imgParam = URLEncoder.encode(imgStr, "UTF-8");

			// String filePath2 = "[本地文件路径]";
			// byte[] imgData2 = FileUtil.readFileByBytes(filePath2);
			// String imgStr2 = Base64Util.encode(imgData2);
			// String imgParam2 = URLEncoder.encode(imgStr2, "UTF-8");

			String param = "uid=" + "liulin" + "&top_num=" + 1 + "&images=" + imgParam;// + "," + imgParam2;

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			// String accessToken = "[调用鉴权接口获取的token]";
			String accessToken = AuthService.getAuth();

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 人脸查找——识别 从图片库总查找人脸匹配的人，并返回人员ID
	 * 
	 */
	public static String identify() {
		// 请求url
		String url = "https://aip.baidubce.com/rest/2.0/face/v2/identify";
		try {
			// 本地文件路径
			String filePath = "e:\\2.png";
			byte[] imgData = FileUtil.readFileByBytes(filePath);
			String imgStr = Base64Util.encode(imgData);
			String imgParam = URLEncoder.encode(imgStr, "UTF-8");

			// String filePath2 = "e:\\2.png";
			// byte[] imgData2 = FileUtil.readFileByBytes(filePath2);
			// String imgStr2 = Base64Util.encode(imgData2);
			// String imgParam2 = URLEncoder.encode(imgStr2, "UTF-8");

			String param = "group_id=" + "yunke" + "&user_top_num=" + "1" + "&face_top_num=" + "1" + "&images="
					+ imgParam;// + "," + imgParam2;

			// 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
			String accessToken = AuthService.getAuth();

			String result = HttpUtil.post(url, accessToken, param);
			System.out.println(result);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * detect
	 */
	public static String detect() {
		// 初始化一个AipFace
		AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);

		// 可选：设置网络连接参数
		client.setConnectionTimeoutInMillis(2000);
		client.setSocketTimeoutInMillis(60000);

		// 可选：设置代理服务器地址, http和socket二选一，或者均不设置
		// client.setHttpProxy("proxy_host", proxy_port); // 设置http代理
		// client.setSocketProxy("proxy_host", proxy_port); // 设置socket代理

		// 可选：设置log4j日志输出格式，若不设置，则使用默认配置
		// 也可以直接通过jvm启动参数设置此环境变量
		// System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
		// 传入可选参数调用接口
		HashMap<String, String> options = new HashMap<String, String>();
		options.put("max_face_num", "1");// 最多处理人脸数目，默认值1
		options.put("face_fields", "age,beauty,expression,gender,glasses,race");// 包括age,beauty,expression,faceshape,gender,glasses,landmark,race,qualities信息，逗号分隔，默认只返回人脸框、概率和旋转角度
		// 调用接口
		String path = "E:\\face.jpg";
		JSONObject res = client.detect(path, options);
		System.out.println(res.toString(2));
		return null;
	}

	public static void main(String[] args) {
		FaceSample.identify();
	}
}